﻿//
// Created by LiuYou on 2021/4/19.
//

#include <iostream>

void print();

/**
 * @brief 一个一个拿出来, 然后对每一个进行处理。
 * @tparam T
 * @tparam Types
 * @param firstArg
 * @param args
 */
template<typename T, typename... Types>
void print(const T& firstArg, const Types& ... args);

/**
 * @brief 这个函数和上面的function template是可以共存的！
 * 这个更加泛化，而上面那个更加特化！
 * 而编译器是谁更加特化就调用谁！
 *
 * 而且该function template和上面较本function template特化一点的一起存在时，该function template永远不会被调用！！！！
 * @tparam Types
 * @param args
 */
template<typename... Types>
void print(const Types& ... args);


int main() {
    print(5, 'a', "你好", 4.4);
    std::cout << "=================================================" << std::endl;
    print(5, 2, 3, 4, 5, 6, 3, "ni hao");


    return 0;
}

void print() {

}

template<typename T, typename... Types>
void print(const T& firstArg, const Types& ... args) {
    // 对每一个进行处理。
    // 这里是将每一个进行打印输出。
    // sizeof...(args)可以计算出一包中参数的个数。
    std::cout << sizeof...(args) << " ";
    std::cout << firstArg << " " << sizeof...(args) << std::endl;
    print(args...);
}

template<typename... Types>
void print(const Types& ... args) {

}